// 导入媒体库助手模块，用于处理照片选择
import { photoAccessHelper } from '@kit.MediaLibraryKit'
// 导入文件IO模块，用于文件操作
import { fileIo } from '@kit.CoreFileKit'
// 导入图像处理模块，用于图像压缩和打包
import { image } from '@kit.ImageKit';
import { Context } from '@kit.AbilityKit';

class UploadImage{

  // 上传完整图片
  async uploadImage(ctx:Context) {
    // 创建照片选择选项对象
    const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
    // 设置照片的MIME类型
    photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
    // 设置最大选择数量
    photoSelectOptions.maxSelectNumber = 1;
    // 创建照片选择器实例
    const photoPicker = new photoAccessHelper.PhotoViewPicker();
    // 等待用户选择照片并获取结果
    const photoRes = await photoPicker.select(photoSelectOptions);
    // 获取选择的第一张照片的URI
    const uri = photoRes.photoUris[0];
    // 以只读模式打开选中的照片文件
    const file = fileIo.openSync(uri, fileIo.OpenMode.READ_ONLY);
    // 构建文件在缓存目录中的路径
    const filePath = ctx.cacheDir + '/' + file.name;
    // 将文件复制到缓存目录
    fileIo.copyFileSync(file.fd, filePath);
    // 关闭文件描述符
    fileIo.closeSync(file.fd);
    // 返回文件路径
    return filePath;
  }

  // 上传压缩图片
  async uploadPicture(ctx:Context,size:number){
    // 以只读模式打开选中的照片文件
    const file = await newSelectFile();
    // 创建图像源对象
    const imageSource = image.createImageSource(file.fd)
    // 创建图像打包器对象
    const imageParker = image.createImagePacker()
    // 将图像压缩为JPEG格式，质量为指定值
    const arrayBuffer = await imageParker.packToData(imageSource, { format: 'image/jpeg', quality: size })
    // 构建新的文件路径，使用当前时间戳作为文件名
    const newFilePath = ctx.cacheDir + '/' + Date.now() + '.jpg'
    // 以创建和读写模式打开新文件
    const newFile = fileIo.openSync(newFilePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE)
    // 将压缩后的图像数据写入新文件
    fileIo.writeSync(newFile.fd, arrayBuffer)
    // 关闭文件描述符
    fileIo.closeSync(newFile.fd)
    // 返回新文件路径
    return newFilePath
  }
}

// 导出UploadImage类的实例
export const uploadImage = new UploadImage()

// 异步函数，用于选择照片文件
async function newSelectFile() {
  // 创建照片选择选项对象
  const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
  // 设置照片的MIME类型
  photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
  // 设置最大选择数量
  photoSelectOptions.maxSelectNumber = 1;

  // 创建照片选择器实例
  const photoPicker = new photoAccessHelper.PhotoViewPicker();

  // 等待用户选择照片并获取结果
  const photoRes = await photoPicker.select(photoSelectOptions);
  // 获取选择的第一张照片的URI
  const uri = photoRes.photoUris[0];
  // 以只读模式打开选中的照片文件
  const file = fileIo.openSync(uri, fileIo.OpenMode.READ_ONLY);
  // 返回文件对象
  return file;
}